/**
 * symbol 是表示独一无二的值
 * Symbol(string)函数可以接受一个字符串作为参数，
 * 表示对 Symbol 实例的描述，主要是为了在控制台显示，
 * 或者转为字符串时，比较容易区分。
 * 1.不是一个对象，是一个数据类型
 * 2.防止和别的属性名有冲突
 * 3.对象里的symbols属性需要通过特殊方法获取
 */
(()=>{
    const COLOR={
        yellow:Symbol("yellow"),
        green:Symbol("green")
    }
    let color="yellow";
    
    if(color==COLOR.yellow){
        console.log("ye");
    }else{
        console.log("not");
    }
    
    
    if(COLOR.yellow==COLOR.yellow){
        console.log("ye");
    }else{
        console.log("not");
    }
});


{//声明与写法
    let mySymbol = Symbol();

    // 第一种写法
    let a1 = {};
    a1[mySymbol] = 'Hello!';

    // 第二种写法
    let a2 = {
    [mySymbol]: 'Hello!'
    };

    // 第三种写法
    let a3 = {};
    Object.defineProperty(a3, mySymbol, { value: 'Hello!' });

    // 以上写法都得到同样结果
    a1[mySymbol] // "Hello!"
}

{//获取方式
    let obj={};
    let aa=Symbol("aa");
    let bb=Symbol("bb");
    obj={
        [bb]:'bb'
    }
    obj[aa]='aa';
    //console.log(obj);
    //正常循环没有找到symbols，需要通过下面方法才可以
    for(let s in obj){
        console.log("s",s);
    }
    //console.log(obj[aa]);
    //1.获取symbols
    const objSymbols=Object.getOwnPropertySymbols(obj);
    //console.log(objSymbols);
     //2.获取symbols
   // console.log(Reflect.ownKeys(obj));
    for (let index = 0; index < objSymbols.length; index++) {
        const syb = objSymbols[index];
        
       // console.log(syb);
       // console.log(obj[syb]);
    }
    //每次都创建新的
    let a=Symbol("a");
    let b=Symbol("a");
    //console.log(a===b);//false

    //登记在全局环境中供搜索，遇到一样的就不会创建新的
    let a1=Symbol.for("a");
    let b1=Symbol.for("a");
    //console.log(a1===b1);//true


    //Symbol.keyFor()方法返回一个已登记的 Symbol 类型值的key
    let a2=Symbol.keyFor(a1);
    //console.log(a2);

    
    
}

()=>{//转换
    let a2=Symbol("aa");
    //console.log(String(a2)) // 'Symbol(aa)'
    //console.log(a2.toString()) // 'Symbol(aa)'
    //console.log(Boolean(a2)) // true
    //console.log(a2.description) // a es2019才有
}